﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;

namespace BCCommon
{
    /// <summary>
    /// 执行command命令工具
    /// </summary>
    public class ExeCommandUtils
    {
        /// <summary>  
        /// 执行cmd命令  
        /// </summary>  
        /// <param name="commandText">命令文本</param>  
        /// <param name="isWindows"></param>
        /// <returns></returns>  
        public string ExeCommand(string commandText, bool isWindows)
        {
            return isWindows ? WindowCommand(commandText) : LinuxCommand(commandText);
        }
        private string LinuxCommand(string commandText)
        {
            Process process = new Process();
            process.StartInfo.FileName = "bash";
            process.StartInfo.CreateNoWindow = false; // 获取或设置指示是否在新窗口中启动该进程的值（不想弹出powershell窗口看执行过程的话，就=true）
            process.StartInfo.RedirectStandardInput = true;  //指示应用程序是否从StandardInput流中读取  
            process.StartInfo.RedirectStandardOutput = true; //将应用程序的输入写入到StandardOutput流中  
            process.StartInfo.RedirectStandardError = true;  //将应用程序的错误输出写入到StandarError流中  
            process.StartInfo.UseShellExecute = false;
            string strOutput;
            try
            {
                process.Start();
                process.StandardInput.WriteLine(commandText);
                process.StandardInput.WriteLine("exit");         //将 exit 命令写入StandardInput流中 
                strOutput = process.StandardOutput.ReadToEnd();   //读取所有输出的流的所有字符  
                process.WaitForExit();
                process.Close();
            }
            catch (Exception e)
            {
                strOutput = e.Message;
            }
            return strOutput;
        }
        private string WindowCommand(string commandText)
        {
            Process process = new Process();  //创建并实例化一个操作进程的类：Process  
            process.StartInfo.FileName = "cmd.exe";    //设置要启动的应用程序  
            process.StartInfo.UseShellExecute = false;   //设置是否使用操作系统shell启动进程  
            process.StartInfo.RedirectStandardInput = true;  //指示应用程序是否从StandardInput流中读取  
            process.StartInfo.RedirectStandardOutput = true; //将应用程序的输入写入到StandardOutput流中  
            process.StartInfo.RedirectStandardError = true;  //将应用程序的错误输出写入到StandarError流中  
            process.StartInfo.CreateNoWindow = false;    //是否在新窗口中启动进程  
            string strOutput;
            try
            {
                process.Start();
                process.StandardInput.WriteLine(commandText);    //将CMD命令写入StandardInput流中  
                process.StandardInput.WriteLine("exit");         //将 exit 命令写入StandardInput流中  
                strOutput = process.StandardOutput.ReadToEnd();   //读取所有输出的流的所有字符  
                process.WaitForExit();                           //无限期等待，直至进程退出  
                process.Close();                                  //释放进程，关闭进程  
            }
            catch (Exception e)
            {
                strOutput = e.Message;
            }
            return strOutput;
        }
    }
}
